let isFirst = true; // 是否是第一次显示数据
let isConnected = false; // 是否已经连接
let isTimer = 0; // 是否正在倒计时
let isCancelTimer = false; // 是否取消倒计时
let doms = {};
const blueToothUtil = new BlueToothUtil(() => {
    alert('蓝牙设备已断开连接');
    closeConnect();
});

function showTips(e, msg) {
    alert(msg);
}

async function connect() {
    if(isConnected) {
        return;
    }

    const res = await connectBlueTooth();
    if(!res) {
        return;
    }
    isConnected = true;
    doms.infoDiv.style.display = 'flex';
    doms.connectBtn.style.display = 'none';
}

async function disconnect() {
    console.log('断开连接');
    if (!isConnected) {
        return;
    }
    await blueToothUtil.disconnect();
    closeConnect();
};

function closeConnect() {
    isConnected = false;
    doms.infoDiv.style.display = 'none';
    doms.connectBtn.style.display = 'block';
}

async function connectBlueTooth() {
    let res = false;
    try {
        await blueToothUtil.request();
        await blueToothUtil.connect();

        await blueToothUtil.startOrderNotifications(data => {
            const decoder = new TextDecoder('utf-8');
            const value =  decoder.decode(data.target.value);
            readData(value);
            console.log(value);
        })
        return true;
    } catch(error) {
        console.error(error);
    }
    return res;
}

function init() {
    const batVText = document.getElementById('bat-v');
    const usbVText = document.getElementById('usb-v');
    const capVText = document.getElementById('cap-v');
    const capCText = document.getElementById('cap-c');

    const chaSText = document.getElementById('cha-s');
    const chaVText = document.getElementById('cha-v');
    const ligBText = document.getElementById('lig-b');
    const ligSText = document.getElementById('lig-s');
    const ligSSText = document.getElementById('lig-ss');


    const disSText = document.getElementById('dis-s');
    const disLText = document.getElementById('dis-l');
    const disMText = document.getElementById('dis-m');
    const modText = document.getElementById('mod');

    const autoVText = document.getElementById('auto-v');
    const carVText = document.getElementById('car-v');
    const powerText = document.getElementById('power');

    const ligSBtn = document.getElementById('lig-s-btn');
    const ligSSBtn = document.getElementById('lig-ss-btn');
    const offBtn = document.getElementById('off-btn');
    const offChaBtn = document.getElementById('off-cha-btn');
    const autoBtn = document.getElementById('auto-btn');
    const timerBtn = document.getElementById('timer-btn');
    const manualBtn = document.getElementById('manual-btn');

    const disMOpt = document.getElementById('dis-m-opt');
    const modOpt = document.getElementById('mod-opt');

    const chaSInput = document.getElementById('cha-s-in');
    const ligBInput = document.getElementById('lig-b-in');
    const chaVInput = document.getElementById('cha-v-in');
    const autoVInput = document.getElementById('auto-v-in');
    const carVInput = document.getElementById('car-v-in');

    const disTimer = document.getElementById('dis-timer');
    const connectBtn = document.getElementById('connect-btn');
    const infoDiv = document.getElementById('info');

    // infoDiv.style.display = 'none';

    doms = {batVText, usbVText, capVText, capCText, chaSText, chaVText, ligBText, ligSText, disSText, disLText, disMText, modText, autoVText, carVText, powerText,
        ligSBtn, offBtn, offChaBtn, autoBtn, timerBtn, manualBtn, ligSSBtn, disTimer, connectBtn, infoDiv,
        disMOpt, modOpt, chaSInput, ligBInput, chaVInput, autoVInput, carVInput, ligSSText};
}

function readTest() {
    setInterval(() => {
        const value = document.getElementById('test-data').value;
        readData(value, doms);
    }, 500);
}

// 显示读取到的值
function readData(value) {
    const list = value.split('-');
    if (list.length !== 19) {
        return;
    }
    const batV = parseFloat(list[0]); // 电瓶电压
    const usbV = parseFloat(list[1]); // USB电压
    const capV = parseFloat(list[2]); // 电容电压
    const capC = parseFloat(list[3]); // 电容温度

    const chaS = parseInt(list[4]); // 充电速度
    const chaV = parseFloat(list[5]); // 截止电压
    const ligB = parseInt(list[6]); // 照明亮度
    const ligS = parseInt(list[7]); // 照明状态 0：关闭，1：开启

    const disS = parseInt(list[8]); // 放电状态 0：关闭，1：开启
    const disL = parseInt(list[9]); // 保护状态 0：关闭，1：开启
    const disM = parseInt(list[10]); // 放电模式 0：有电瓶，1：无电瓶 2：全手动
    const mod = parseInt(list[11]); // 用途模式 0: 应急，1：车载

    const autoV = parseInt(list[12]); // 自动放电灵敏度
    const carV = parseInt(list[13]); // 车载放电灵敏度
    const power = parseInt(list[14]); // 电量百分比
    const autoFlag = parseInt(list[15]); // 自动放电标志 0：关闭，1：开启
    const timerFlag = parseInt(list[16]); // 定时放电标志 0：关闭，1：开启
    const ligSS = parseInt(list[17]); // 照明可用 0：关闭，1：开启


    if (timerFlag === 1 && disS === 0) { // 倒计时放电状态
        disTimerInterval(doms.disTimer);
    } else {
        isCancelTimer = true;
    }


    doms.powerText.innerHTML = power.toFixed(0); // 电量百分比

    doms.capVText.innerHTML = capV.toFixed(1); // 电容电压显示
    doms.chaSText.innerHTML = chaS.toFixed(0); // 充电速度百分比显示
    doms.chaVText.innerHTML = chaV.toFixed(1); // 截止电压显示
    doms.ligBText.innerHTML = ligB.toFixed(0); // 照明亮度显示

    doms.autoVText.innerHTML = autoV.toFixed(0); // 自动放电灵敏度显示
    doms.carVText.innerHTML = carV === 0 ? '点火接通' : (carV === 1 ? "等压接通" : carV.toFixed(0)); // 车载放电灵敏度显示

    // 照明可用状态显示
    if (ligSS > 0) {
        doms.ligSSText.innerHTML = '启用';
        doms.ligSSText.classList.add('green');
    } else {
        doms.ligSSText.innerHTML = '禁用';
        doms.ligSSText.classList.remove('green');
    }

    // 照明开启状态显示
    if (ligS > 0) {
        doms.ligSText.innerHTML = '开';
        doms.ligSText.classList.add('green');
    } else {
        doms.ligSText.innerHTML = '关';
        doms.ligSText.classList.remove('green');
    }

    // 放电状态显示
    if (disS > 0) {
        doms.disSText.innerHTML = '放电中';
        doms.disSText.classList.add('red');
        doms.disSText.classList.remove('orange');
    } else  if (disS === 0 && ( autoFlag) === 1 || timerFlag === 1) {
        doms.disSText.innerHTML = '待放电';
        doms.disSText.classList.remove('red');
        doms.disSText.classList.add('orange');
    } else {
        doms.disSText.innerHTML = '未放电';
        doms.disSText.classList.remove('red');
        doms.disSText.classList.remove('orange');
    }

    // 电瓶电压显示
    doms.batVText.innerText = batV.toFixed(1);
    if (batV > 30.0) {
        doms.batVText.classList.add('red');
    } else {
        if (batV <= 0.5) {
            doms.batVText.innerText = '--';
        }
        doms.batVText.classList.remove('red');
    }

    // usb电压显示
    if (usbV > 3.5) {
        doms.batVText.innerText = '--';
        doms.usbVText.innerText = usbV.toFixed(1);
    } else if (usbV < 3.5) {
        doms.usbVText.innerText = '--';
    } else {
        doms.usbVText.innerText = '3.5'
    }

    // 温度显示
    doms.capCText.innerText = capC.toFixed(1);
    if (capC > 90.0) {
        doms.capCText.classList.add('red');
    } else {
        doms.capCText.classList.remove('red');
    }

    // 保护状态显示
    if (disL > 0) {
        doms.disLText.innerHTML = '开';
        doms.disLText.classList.add('green');
    } else {
        doms.disLText.innerHTML = '关';
        doms.disLText.classList.remove('green');
    }

    // 放电模式显示
    if (disM === 2) {
        doms.disMText.innerHTML = '全手动';
    } else if (disM === 1) {
        doms.disMText.innerHTML = '无电瓶';
    } else {
        doms.disMText.innerHTML = '有电瓶';
    }

    // 用途模式显示
    if (mod > 0) {
        doms.modText.innerHTML = '车载稳压';
    } else {
        doms.modText.innerHTML = '应急救援';
    }

    const values = {batV, ligS, ligSS, disM, mod, chaS, ligB, chaV, autoV, carV, disS, timerFlag, autoFlag, disL};
    writeDefaultData(values, doms);

    isFirst = false;
}

// 倒计时放电显示
function disTimerInterval(timerText) {
    if (isTimer > 0) {
        return;
    }
    isTimer = 10;
    timerText.style.display = 'inline-block';
    timerText.innerHTML = isTimer;
    const timer = setInterval(() => {
        isTimer--;
        if (isTimer === 0 || isCancelTimer) {
            clearInterval(timer);
            isTimer = 0;
            isCancelTimer = false;
            timerText.style.display = 'none';
        } else {
            timerText.innerHTML = isTimer;
        }
    }, 1000);
}

// 写入操作默认填充的数据
function writeDefaultData(values, doms) {
    // 照明状态按钮显示
    if (values.ligSS > 0) {
        doms.ligSSBtn.innerHTML = '禁用照明';
    } else {
        doms.ligSSBtn.innerHTML = '启用照明';
    }

    // 照明按钮显示
    if (values.ligSS > 0) {
        doms.ligSBtn.removeAttribute('disabled');
        if (values.ligS > 0) {
            doms.ligSBtn.innerHTML = '关灯';
        } else {
            doms.ligSBtn.innerHTML = '开灯';
        }
    } else {
        doms.ligSBtn.setAttribute('disabled', 'true');
    }


    // 关机按钮状态
    if (values.batV > 1.0) {
        doms.offBtn.setAttribute('disabled', 'true');
    } else {
        doms.offBtn.removeAttribute('disabled');
    }

    if (values.disS === 1 || values.mod === 1 || values.disL === 1 || values.timerFlag === 1 || values.autoFlag === 1) {
        doms.autoBtn.setAttribute('disabled', 'true');
        doms.timerBtn.setAttribute('disabled', 'true');
        doms.manualBtn.setAttribute('disabled', 'true');
    } else {
        // 手动放电按钮状态
        if ([1,0].includes(values.disM)) {
            doms.manualBtn.setAttribute('disabled', 'true');
        } else {
            doms.manualBtn.removeAttribute('disabled');
        }

        // 自动放电按钮状态
        if ([1,2].includes(values.disM)) {
            doms.autoBtn.setAttribute('disabled', 'true');
        } else {
            doms.autoBtn.removeAttribute('disabled');
        }

        // 倒计时放电按钮状态
        if ([2].includes(values.disM)) {
            doms.timerBtn.setAttribute('disabled', 'true');
        } else {
            doms.timerBtn.removeAttribute('disabled');
        }
    }

    // 关闭放电按钮状态
    if ((values.disS === 0 && values.timerFlag === 0 && values.autoFlag === 0) || values.mod === 1) {
        doms.offChaBtn.setAttribute('disabled', 'true');
    } else {
        doms.offChaBtn.removeAttribute('disabled');
    }

    if (!isFirst) { // 只在第一次时填充默认值
        return;
    }

    doms.disMOpt.selectedIndex = values.disM; // 放电模式下拉框默认选中值
    doms.modOpt.selectedIndex = values.mod; // 用途模式下拉框默认选中值

    if (doms.chaSInput.value === '' ) { // 充电速度百分比默认填充值
        doms.chaSInput.value = values.chaS;
    }
    if (doms.ligBInput.value === '') { // 照明亮度默认填充值
        doms.ligBInput.value = values.ligB;
    }
    if (doms.chaVInput.value === '') { // 截止电压默认填充值
        doms.chaVInput.value = values.chaV.toFixed(1);
    }
    if (doms.autoVInput.value === '') { // 自动放电灵敏度默认填充值
        doms.autoVInput.value = values.autoV;
    }
    if (doms.carVInput.value === '') { // 车载放电灵敏度默认填充值
        doms.carVInput.value = values.carV
    }

}


// 修改充电速度
function changeChaS(value) {
    value = parseInt(value);
    if (isNaN(value) || value < 0 || value > 100) {
        alert('充电速度必须在0~100之间');
        return;
    }
    let order = '08-';
    if (value < 10) {
        order += '00' + value;
    } else if (value < 100) {
        order += '0' + value;
    } else {
        order += '100';
    }
    sendValue(order);
}

// 修改灯光亮度
function changeLigB(value) {
    value = parseInt(value);
    if (isNaN(value) || value < 1 || value > 100) {
        alert('灯光亮度必须在1~100之间');
        return;
    }
    let order = '09-';
    if (value < 10) {
        order += '00' + value;
    } else if (value < 100) {
        order += '0' + value;
    } else {
        order += '100';
    }
    sendValue(order);
}

// 修改充电截止电压
function changeChaV(value) {
    value = parseFloat(value);
    if (isNaN(value) || value < 0 || value > 15.0) {
        alert('截止电压必须在0.0~15.0之间');
        return;
    }
    let order = '10-';
    if (value < 1.0) {
        order += '00' + (value*10).toFixed(0);
    } else if (value < 10.0) {
        order += '0' + (value*10).toFixed(0);
    } else {
        order += (value*10).toFixed(0);
    }
    sendValue(order);
}

// 修改放电灵敏度
function changeAutoV(value) {
    value = parseInt(value);
    if (isNaN(value) || value < 1 || value > 9) {
        alert('自动放电灵敏度必须在1~9之间');
        return;
    }
    let order = '11-00' + value;
    sendValue(order);
}

// 修改放电灵敏度
function changeCarV(value) {
    value = parseInt(value);
    if (isNaN(value) || value < 0 || value > 9) {
        alert('车载放电灵敏度必须在0~9之间');
        return;
    }
    let order = '12-00' + value;
    sendValue(order);
}

function sendValue(value, event, disabled) {
    sendBlueData(value);
    if (disabled) {
        event.target.setAttribute('disabled', 'true');
    }
}

// 发送到蓝牙设备
function sendBlueData(str) {
    console.log('writeData', str);
    if(!isConnected) {
        return;
    }
    const byteArray = new TextEncoder().encode(str);
    const buffer = byteArray.buffer;
    blueToothUtil.writeOrder(buffer);
}